package demo1;

import java.util.Deque;
import java.util.LinkedList;

/**
 * PCB队列，用于存储不同状态的进程（阻塞、就绪、执行）。
 * 使用双端队列（Deque）实现，方便从队头或队尾操作。
 */
public class  PCBQueue {
    private final Deque<PCB> queue;
    private final String name;
    // 队列的最大容量
    private final int capacity;

    /**
     * 构造函数，初始化队列、名称和容量。
     * @param name 队列名称
     * @param capacity 队列最大容量
     */
    public PCBQueue(String name, int capacity) {
        this.queue = new LinkedList<>();
        this.name = name;
        this.capacity = capacity;
    }

    /**
     * 将PCB添加到队列尾部。
     * @param pcb 要添加的进程控制块
     * @return true：添加成功；false：添加失败（队列已满或PCB为空）
     */
    public boolean offer(PCB pcb) {
        if (pcb != null && queue.size() < capacity) {
            queue.offerLast(pcb); // 添加到队尾
            System.out.println("进程" + pcb.getId() + "已加入" + name + "队尾");
            return true;
        }
        return false;
    }

    /**
     * 从队列头部移除并返回PCB。
     * @return 队头的PCB，如果队列为空则返回null
     */
    public PCB remove() {
        if (!queue.isEmpty()) {
            return queue.removeFirst(); // 移除并返回队头
        }
        return null;
    }

    /**
     * 判断队列是否为空。
     * @return true：队列为空；false：队列不为空
     */
    public boolean isEmpty() {
        return queue.isEmpty();
    }

    /**
     * 显示队列中的所有PCB信息。
     */
    public void show() {
        System.out.print(this.name + ": ");
        for (PCB pcb : queue) {
            System.out.print(pcb.getId() + " ");
        }
        System.out.println();
    }

    // Getter方法
    public String getName() {
        return name;
    }

    public int getCapacity() {
        return capacity;
    }
}